package com.cpimex.eprice.model;

import java.util.*;
import java.sql.*;
import com.cpimex.eprice.bean.PerfilBean;
import com.cpimex.eprice.bean.DirigidoBean;
import com.cpimex.eprice.bean.NotificacionBean;
import com.cpimex.eprice.bean.NotificacionOtroC;

public class Notificacion {

    /**
     *
     **/
    private ArrayList listarNotificacion(Statement stmt) throws SQLException {
        ArrayList arrL_notificacion = new ArrayList();
        String str_query = " SELECT id_notificacion,                         " +
                           "        codigo_notificacion,                     " +
                           "        desc_notificacion                        " +
                           " FROM ep_notificacion                            ";
        ResultSet rs = stmt.executeQuery(str_query);

        while (rs.next()) {
            String str_idNotificacion = rs.getString("id_notificacion");
            String str_codigoNotificacion = rs.getString("codigo_notificacion");
            String str_descNotificacion = rs.getString("desc_notificacion");

            NotificacionBean bn_notificacion = new NotificacionBean();
            bn_notificacion.setStr_idNotificacion(str_idNotificacion);
            bn_notificacion.setStr_codigoNotificacion(str_codigoNotificacion);
            bn_notificacion.setStr_descNotificacion(str_descNotificacion);
            bn_notificacion.setArrL_dirigido(listarDirigido(stmt, str_idNotificacion));

            arrL_notificacion.add(bn_notificacion);
        }
        return arrL_notificacion;
    }


    /**
     *
     **/
    private ArrayList listarPerfil(Statement stmt, String str_idNotificacion,
                                   String str_idDirigido) throws SQLException {
        ArrayList arr_perfil = new ArrayList();
        String str_query =
            " SELECT mc.id_matrizNotificacion,                               " +
            "        mc.id_dirigidoCorreo,                                   " +
            "        mc.id_perfil,                                           " +
            "        vp.desc_perfil                                          " +
            " FROM ep_matriznotificacion mc                                  " +
            "        INNER JOIN ep_vw_perfil vp                              " +
            "        ON mc.id_perfil = vp.id_perfil                          " +
            " WHERE mc.id_notificacion = '" + str_idNotificacion + "'        " +
            " AND mc.id_dirigidoCorreo = '" + str_idDirigido +"'             ";

        ResultSet rs = stmt.executeQuery(str_query);
        while (rs.next()) {
            PerfilBean bn_perfil = new PerfilBean();
            String str_idPerfil = rs.getString("id_perfil");
            String str_descPerfil = rs.getString("desc_perfil");

            bn_perfil.setStr_idPerfil(str_idPerfil);
            bn_perfil.setStr_descPerfil(str_descPerfil);

            arr_perfil.add(bn_perfil);
        }
        return (ArrayList) arr_perfil;
    }


    private ArrayList listarDirigido(Statement stmt, String str_idNotificacion) throws
            SQLException {
        ArrayList arr_dirigido = new ArrayList();
        String str_query = " SELECT id_dirigidoCorreo, " +
                           "        descripcion_dirigidoCorreo" +
                           " FROM ep_dirigidoCorreo ";

        ResultSet rs = stmt.executeQuery(str_query);

        while (rs.next()) {
            String str_idDirigido = rs.getString("id_dirigidoCorreo");
            String str_descDirigido = rs.getString("descripcion_dirigidoCorreo");
            Map map_url = new HashMap();
            map_url.put("service", "editarNotificacion");
            map_url.put("str_idNotificacion", str_idNotificacion);
            map_url.put("str_idDirigido", str_idDirigido);

            DirigidoBean bn_dir = new DirigidoBean();
            bn_dir.setStr_idDirigido(str_idDirigido);
            bn_dir.setStr_descDirigido(str_descDirigido);
            bn_dir.setMap_urlEditar(map_url);

            arr_dirigido.add(bn_dir);
        }
        return (ArrayList) arr_dirigido;
    }

    public ArrayList listarOtro(Statement stmt, String str_idNotificacion,
                                String str_idDirigido) throws SQLException {
        ArrayList arr_otro = new ArrayList();
        String str_query =
                " SELECT  oc.id_notificacionOtroCorreo,                        " +
                "         oc.mail_notificacionOtroCorreo,                      " +
                "         vu.nomina_usuario,                                   " +
                "         vu.nombre_usuario                                    " +
                " FROM ep_notificacionOtroCorreo oc                            " +
                "      INNER JOIN ep_vw_usuario vu                             " +
                "      ON oc.mail_notificacionOtroCorreo = vu.nomina_usuario   " +
                " WHERE oc.id_notificacion = '" + str_idNotificacion + "'  AND " +
                "           oc.id_dirigidoCorreo = '" + str_idDirigido + "'    ";

        ResultSet rs = stmt.executeQuery(str_query);

        if (rs.next()) {
            String str_idNotificacionOtro = rs.getString("id_notificacionOtroCorreo");
            String str_mail_notificacionOtroCorreo = rs.getString("mail_notificacionOtroCorreo");
            String str_nominaUsuario = rs.getString("nomina_usuario");
            String str_nombreUsuario = rs.getString("nombre_usuario");

            NotificacionOtroC bn_otro = new NotificacionOtroC();
            bn_otro.setStr_idNotificacionOc(str_idNotificacionOtro);
            bn_otro.setStr_nominaUsuario(str_nominaUsuario);
            bn_otro.setStr_nombreUsuario(str_nombreUsuario);
            bn_otro.setStr_mailNotificacionOc(str_mail_notificacionOtroCorreo);

            arr_otro.add(bn_otro);
        }
        return arr_otro;
    }


    private void insertarOtro(Statement stmt, String str_idNotificacion,
                              String str_idDirigido, String str_nomina) throws
            SQLException {
        if (!str_nomina.equals("")) {
            String str_query =
                    " INSERT INTO ep_notificacionOtroCorreo( id_notificacion,                             " +
                    "                                   id_dirigidoCorreo,                      " +
                    "                                   mail_notificacionOtroCorreo)                 " +
                    "        VALUES('" + str_idNotificacion + "', '" +
                    str_idDirigido + "', '" + str_nomina + "')";
            //System.out.println(str_query);
            stmt.executeUpdate(str_query);
        }
    }


    private void eliminarOtro(Statement stmt, String str_idNotificacion,
                              String str_idDirigido) throws SQLException {
        String str_query =
                " DELETE FROM ep_notificacionOtroCorreo                      " +
                "        WHERE id_notificacion = '" + str_idNotificacion + "' AND     " +
                "              id_dirigidoCorreo = '" + str_idDirigido + "' ";
        stmt.executeUpdate(str_query);

    }

    public void actualizarOtro(Statement stmt, String str_idNotificacion,
                               String str_idDirigido, String str_nomina) throws
            SQLException {
        eliminarOtro(stmt, str_idNotificacion, str_idDirigido);
        insertarOtro(stmt, str_idNotificacion, str_idDirigido, str_nomina);
    }


    public ArrayList listarMatriz(Statement stmt) throws SQLException {
        ArrayList arr_matriz = new ArrayList();
        ArrayList arr_per    = new ArrayList();
        ArrayList arr_dir    = new ArrayList();
        ArrayList arr_otro   = new ArrayList();

        ArrayList arr_notificacion = listarNotificacion(stmt);
        Iterator it_notificacion = arr_notificacion.iterator();
        while (it_notificacion.hasNext()) {
            NotificacionBean bn_notificacion = (NotificacionBean) it_notificacion.next();

            arr_dir = listarDirigido(stmt, bn_notificacion.getStr_idNotificacion());
            Iterator it_dirigido = arr_dir.iterator();

            while (it_dirigido.hasNext()) {
                DirigidoBean bn_dir = (DirigidoBean) it_dirigido.next();
                arr_per = listarPerfil(stmt, bn_notificacion.getStr_idNotificacion(),
                                       bn_dir.getStr_idDirigido());
                bn_dir.setArr_perfil(arr_per);

                arr_otro = listarOtro(stmt, bn_notificacion.getStr_idNotificacion(),
                                      bn_dir.getStr_idDirigido());
                bn_dir.setArr_otro(arr_otro);
            }
            bn_notificacion.setArrL_dirigido(arr_dir);
            arr_matriz.add(bn_notificacion);
        }
        return arr_matriz;
    }


    public ArrayList listarPerfiles(Statement stmt, String str_idNotificacion,
                                    String str_idDirigido) throws SQLException {
        ArrayList arr_perfil = new ArrayList();
        String str_query =
            " SELECT vp.id_perfil,                                                                           " +
            "        vp.desc_perfil,                                                                         " +
            "     CASE                                                                                       " +
            "        WHEN vp.id_perfil not in( SELECT id_perfil                                              " +
            "                                  FROM ep_matrizNotificacion                                    " +
            "                                  WHERE id_notificacion = '" + str_idNotificacion + "' AND      " +
            "                                        id_dirigidoCorreo ='" + str_idDirigido + "')            " +
            "        THEN null                                                                               " +
            "        ELSE id_perfil                                                                          " +
            "     END perfil_sel,                                                                            " +
            "     CASE                                                                                       " +
            "        WHEN vp.id_perfil not in( SELECT id_perfil                                              " +
            "                                  FROM ep_matrizNotificacion                                          " +
            "                                  WHERE id_notificacion = '" + str_idNotificacion + "' AND      " +
            "                                        id_dirigidoCorreo !='" + str_idDirigido + "')           " +
            "        THEN  'true'                                                                            " +
            "        ELSE  'false'                                                                           " +
            "     END bloqueo                                                                                " +
            " FROM ep_vw_perfil vp  WHERE vp.id_perfil != 162                                                ";

        ResultSet rs = stmt.executeQuery(str_query);

        while (rs.next()) {
            String str_idPerfil = rs.getString("id_perfil");
            String str_descPerfil = rs.getString("desc_perfil");
            //boolean bool_checked  =  (rs.getString("checked").endsWith("0")?false:true);
            String str_idPerfilS = rs.getString("perfil_sel");
            String str_idPerfilSlctd = rs.getString("bloqueo");

            PerfilBean bn_perfil = new PerfilBean();
            bn_perfil.setStr_idPerfil(str_idPerfil);
            bn_perfil.setStr_descPerfil(str_descPerfil);
            //bn_perfil.setBool_checked(bool_checked);
            bn_perfil.setStr_idPerfilS(str_idPerfilS);
            bn_perfil.setStr_idPerfilSlctd(str_idPerfilSlctd);

            arr_perfil.add(bn_perfil);
        }
        return arr_perfil;
    }


    private void insertaPerfil(Statement stmt, String str_idPerfil,
                               String str_idNotificacion, String str_idDirigido) throws
            SQLException {
        String str_query;

        str_query = "INSERT INTO ep_matrizNotificacion(id_perfil, " +
                    "                            id_notificacion, " +
                    "                            id_dirigidoCorreo)" +
                    "            VALUES('" + str_idPerfil + "', " +
                    "                   '" + str_idNotificacion + "', " +
                    "                   '" + str_idDirigido + "')";
        //System.out.println(str_query);
        stmt.executeUpdate(str_query);
    }

    private void eliminaPerfil(Statement stmt, String str_idNotificacion,
                               String str_idDirigido) throws
            SQLException {
        String str_query = " DELETE FROM ep_matrizNotificacion" +
                           " WHERE id_notificacion  = '" + str_idNotificacion + "' " +
                           " AND  id_dirigidoCorreo = '" + str_idDirigido + "'";
        stmt.executeUpdate(str_query);
    }

    public void actualizarPerfil(Statement stmt, String[] str_idPerfilS,
                                 String str_idNotificacion, String str_idDirigido) throws
            SQLException {
        eliminaPerfil(stmt, str_idNotificacion, str_idDirigido);

        if (str_idPerfilS != null)
            for (int int_i = 0; int_i < str_idPerfilS.length; int_i++) {
                insertaPerfil(stmt, str_idPerfilS[int_i], str_idNotificacion,
                              str_idDirigido);
            }
    }

    public ArrayList listarUsuario(Statement stmt, String str_search) throws
            SQLException {
        ArrayList arr_usuario = new ArrayList();
        String str_query = " SELECT nomina_usuario, " +
                           "        nombre_usuario " +
                           " FROM ep_vw_usuario " +
                           " WHERE nomina_usuario LIKE '%" + str_search +
                           "%' OR " +
                           "       nombre_usuario LIKE '%" + str_search + "%'";

        ResultSet rs = stmt.executeQuery(str_query);
        while (rs.next()) {
            String str_nominaUsuario = rs.getString("nomina_usuario");
            String str_nombreUsuario = rs.getString("nombre_usuario");

            PerfilBean bn_perfil = new PerfilBean();
            bn_perfil.setStr_nomina(str_nominaUsuario);
            bn_perfil.setStr_nombreUsuario(str_nombreUsuario);
            arr_usuario.add(bn_perfil);
        }
        return arr_usuario;
    }
}
